package com.fang.offer;

/**
 * <pre>
 * 题目描述
 * 输入一个整数，输出该数二进制表示中1的个数。其中负数用补码表示。
 * </pre>
 * 
 */
public class OfferNumberOf1 {

	public static void main(String[] args) {
		System.out.println(OfferNumberOf1.numberOf1(1));
		System.out.println(OfferNumberOf1.numberOf1(2));
		System.out.println(OfferNumberOf1.numberOf1(3));
		System.out.println(OfferNumberOf1.numberOf1(-1));

	}

	public static int numberOf1(int n) {
		int temp = 1;
		int count = 0;
		while (temp != 0) {
			if ((n & temp) != 0)
				count++;
			temp = temp << 1;
		}
		return count;
	}

	/**
	 * 把一个整数减去1，在和原来的整数做与运算，会把该整数最右边的一个1变成0， 那么一个整数的二进制表示中有多少个1，就能进行多少次这样的操作
	 * 
	 * @param n
	 * @return
	 */
	public static int numberOf2(int n) {
		int count = 0;
		while (n != 0) {
			++count;
			n = (n - 1) & n;
		}
		return count;
	}
}
